package com.ydl.shopping.core.vo;

import com.ydl.shopping.core.enums.ResultEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import static com.ydl.shopping.core.enums.ResultEnum.ERROR;
import static com.ydl.shopping.core.enums.ResultEnum.SUCCESS;

/**
 * 返回数据封装类
 *
 * @author 林武泰
 */
@Data
@Schema(name = "返回数据封装")
public class ResultVO {
    /** 返回状态码 */
    @Schema(description = "返回状态码")
    private Integer code;
    /** 返回数据 */
    @Schema(description = "返回数据")
    private Object data;
    /** 返回消息 */
    @Schema(description = "返回消息")
    private String message;

    /**
     * 请求结果返回封装
     * @param code 返回结果
     * @param data 返回数据
     * @param message 返回消息
     */
    public ResultVO(Integer code, Object data, String message) {
        this.code = code;
        this.data = data;
        this.message = message;
    }

    public static ResultVO resultEnum(ResultEnum resultEnum) {
        return new ResultVO(resultEnum.getCode(), null, resultEnum.getMessage());
    }

    public static ResultVO resultEnum(ResultEnum resultEnum, Object data) {
        return new ResultVO(resultEnum.getCode(), data, resultEnum.getMessage());
    }

    /**
     * 操作成功，无参
     *
     * @return ResultVO
     */
    public static ResultVO success() {
        return resultEnum(SUCCESS);
    }

    /**
     * 操作成功，只返回消息
     *
     * @param message 返回消息
     * @return ResultVO
     */
    public static ResultVO success(String message) {
        return new ResultVO(SUCCESS.getCode(), null, message);
    }

    /**
     * 操作成功，只返回数据
     *
     * @param data 返回数据
     * @return ResultVO
     */
    public static ResultVO success(Object data) {
        return resultEnum(SUCCESS, data);
    }

    /**
     * 操作成功，返回数据与消息
     *
     * @param data 返回数据
     * @param message  返回消息
     * @return ResultVO
     */
    public static ResultVO success(Object data, String message) {
        return new ResultVO(SUCCESS.getCode(), data, message);
    }

    /**
     * 操作失败，无参
     *
     * @return ResultVO
     */
    public static ResultVO error() {
        return resultEnum(ERROR);
    }

    /**
     * 操作失败，只返回数据
     *
     * @param data 返回数据
     * @return ResultVO
     */
    public static ResultVO error(Object data) {
        return resultEnum(ERROR, data);
    }

    /**
     * 操作失败
     *
     * @param errMessage 返回失败消息
     * @return ResultVO
     */
    public static ResultVO error(String errMessage) {
        return new ResultVO(ERROR.getCode(), null, errMessage);
    }
}
